package models

import (
	"database/sql"
	"encoding/json"
)

type DictPageQuery struct {
	// 关键字(字典项名称)
	Keywords string `form:"keywords,omitempty"`
	// 字典编码
	//TypeCode string `form:"typeCode,omitempty" json:"typeCode,omitempty"`
}

// DictPageData ，数据库查询 字典分页对象
type DictPageData struct {
	// 字典编码
	Code string `json:"code,omitempty"`

	// 字典ID
	ID int64 `json:"id,omitempty"`
	// 字典名称
	Name string `json:"name,omitempty"`
	// 字典状态（1-启用，0-禁用）
	Status int64 `json:"status,omitempty"`
	// 字典项列表
	//DictItems []DictItem `json:"dictItems,omitempty"`
	DictItems sql.NullString `json:"dict_items"` // 存储 JSON 格式的子表数据
}

// DictPageDataRes 用户分页列表响应结果
type DictPageDataRes struct {
	List     []DictPageItemRes `json:"list,omitempty"`
	Total    int64             `json:"total,omitempty"`
	PageNum  int               `json:"pageNum"`
	PageSize int               `json:"pageSize"`
}

// DictPageItemRes ，接口返回 字典分页对象
type DictPageItemRes struct {
	// 字典编码
	Code string `json:"code,omitempty"`

	// 字典ID
	ID int64 `json:"id,omitempty"`
	// 字典名称
	Name string `json:"name,omitempty"`
	// 字典状态（1-启用，0-禁用）
	Status int64 `json:"status,omitempty"`
	// 字典项列表
	DictItems []DictItem `json:"dictItems,omitempty"`
}

// DictItem ，字典数据项
type DictItem struct {
	// 字典ID
	ID int64 `json:"id,omitempty"`
	// 字典名称
	Name string `json:"name,omitempty"`
	// 排序
	Sort int64 `json:"sort,omitempty"`
	// 状态（1-启用，0-禁用）
	Status int64 `json:"status,omitempty"`
	// 字典值
	Value string `json:"value,omitempty"`
}

func ParseDictItems(dicts []DictPageData) ([]DictPageItemRes, error) {
	var roots []DictPageItemRes

	for _, dict := range dicts {

		var dictItems []DictItem
		if dict.DictItems.Valid { // 检查是否有值
			json.Unmarshal([]byte(dict.DictItems.String), &dictItems)

			DictInfo := DictPageItemRes{
				Code:      dict.Code,
				DictItems: dictItems,
				ID:        dict.ID,
				Name:      dict.Name,
				Status:    dict.Status,
			}

			roots = append(roots, DictInfo)
		}
	}

	return roots, nil
}

// ------ 新增字典 -------

type AddDictData struct {
	// 字典编码
	Code string `gorm:"column:code" json:"code,omitempty"`

	// 字典ID
	ID int64 `gorm:"column:id" json:"id,omitempty"`
	// 字典名称
	Name string `gorm:"column:name" json:"name,omitempty"`
	// 字典状态（1-启用，0-禁用）
	Status int64 `gorm:"column:status" json:"status,omitempty"`
}

// AddDictItem ，字典数据项
type AddDictItem struct {
	// 字典ID
	DictId int64 `json:"dict_id,omitempty"`
	// 字典名称
	Name string `json:"name,omitempty"`
	// 排序
	Sort int64 `json:"sort,omitempty"`
	// 状态（1-启用，0-禁用）
	Status int64 `json:"status,omitempty"`
	// 字典值
	Value string `json:"value,omitempty"`
}

// ------ 修改字典 -------

type EditDictData struct {
	// 字典编码
	Code string `gorm:"column:code" json:"code,omitempty"`

	// 字典名称
	Name string `gorm:"column:name" json:"name,omitempty"`
	// 字典状态（1-启用，0-禁用）
	Status int64 `gorm:"column:status" json:"status,omitempty"`
}

// ----- 获取所有数据 ------

type TransformedDict struct {
	Code      string            `json:"code"`
	ID        int64             `json:"id"`
	Name      string            `json:"name"`
	Status    int64             `json:"status"`
	KeyVal    map[string]string `json:"keyVal"`
	ValKey    map[string]string `json:"valKey"`
	DictItems []DictItem        `json:"dictItems"`
}

func TransformTransformedDict(originalDict DictPageItemRes) TransformedDict {
	keyVal := make(map[string]string)
	valKey := make(map[string]string)

	for _, item := range originalDict.DictItems {
		keyVal[item.Value] = item.Name
		valKey[item.Name] = item.Value
	}

	return TransformedDict{
		Code:      originalDict.Code,
		ID:        originalDict.ID,
		Name:      originalDict.Name,
		Status:    originalDict.Status,
		KeyVal:    keyVal,
		ValKey:    valKey,
		DictItems: originalDict.DictItems,
	}
}
